package com.wjp.banquet.common.util;

import lombok.extern.slf4j.Slf4j;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

/**
 * 日期操作类，主要是提供一些静态方法实现String与Date对象的转换，以及String在不同格式之间的转换。 y--years M--months
 * d--days H--hours m--minutes s--seconds S--milliseconds
 *
 * @author
 * @version 1.0
 */
@Slf4j
public class DateUtil {
    /**
     * 转换格式为yyyy-MM-dd HH:mm:ss:SSS。
     */
    public final static String YYYY_MM_DD_HH_MM_SS_SSS = "yyyy-MM-dd HH:mm:ss:SSS";

    /**
     * 转换格式为yyyy-MM-dd HH:mm:ss。
     */
    public final static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    /**
     * 转换格式为yyyy/MM/dd/HH/mm/ss。
     */
    public final static String YYYY_MM_DD_HH_MM_SS_2 = "yyyy-MM-dd-HH-mm-ss";

    /**
     * 转换格式为yyyy-MM-dd HH:mm。
     */
    public final static String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";

    /**
     * 转换格式为yyyy-MM-dd。
     */
    public final static String YYYY_MM_DD = "yyyy-MM-dd";

    /**
     * 转换格式为yyyy-M-d H:m:s:S
     */
    public final static String YYYY_M_D_H_M_S_S = "yyyy-M-d H:m:s:S";

    /**
     * 转换格式为yyyy-M-d H:m:s
     */
    public final static String YYYY_M_D_H_M_S = "yyyy-M-d H:m:s";

    /**
     * 转换格式为yyyy-M-d H:m
     */
    public final static String YYYY_M_D_H_M = "yyyy-M-d H:m";

    /**
     * 转换成格式为yyyy-M-d
     */
    public final static String YYYY_M_D = "yyyy-M-d";

    /**
     * 转换格式为yyyyMMdd HH:mm:ss:SSS。
     */
    public final static String YYYYMMDD_HH_MM_SS_SSS = "yyyyMMdd HH:mm:ss:SSS";

    /**
     * 转换格式为yyyyMMdd HH:mm:ss。
     */
    public final static String YYYYMMDD_HH_MM_SS = "yyyyMMdd HH:mm:ss";

    /**
     * 转换格式为yyyyMMdd HH:mm。
     */
    public final static String YYYYMMDD_HH_MM = "yyyyMMdd HH:mm";

    /**
     * 转换格式为yyyyMMdd。
     */
    public final static String YYYYMMDD = "yyyyMMdd";

    /**
     * 转换格式为yyyyMMddHHmmssSSS。
     */
    public final static String YYYYMMDDHHMMSSSSS = "yyyyMMddHHmmssSSS";

    /**
     * 转换格式为yyyyMMddHHmmss。
     */
    public final static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";

    /**
     * 转换格式为yyyyMMddHHmm。
     */
    public final static String YYYYMMDDHHMM = "yyyyMMddHHmm";

    /**
     * 转换格式为yyyyMMddHHmm。
     */
    public final static String YYYYMMDDHHMMSSS = "yyyyMMddHHmmSSS";

    /**
     * 转换格式为yyyyMM。
     */
    public final static String YYYYMM = "yyyyMM";

    /**
     * 转换格式为yyyy_MM。
     */
    public final static String YYYY_MM = "yyyy-MM";

    /**
     * 转换格式为yyyy。
     */
    public final static String YYYY = "yyyy";

    /**
     * 转换格式为MM。
     */
    public final static String MM = "MM";

    /**
     * 时分秒 00:00:00
     */
    public final static String START_TIME_HMS = " 00:00:00";
    /**
     * 时分秒 23:59:59
     */
    public final static String END_TIME_HMS = " 23:59:59";

    /**
     * 转换格式为yyyy年M月d日H点m分。
     */
    public final static String YYYYMDHM_ZH = "yyyy年M月d日H点m分";

    /**
     * 将Date转换成为指定格式的String。
     *
     * @param date  日期对象。
     * @param style 转换格式。
     * @return 代表日期的字符串。
     */
    public static String dateToString(Date date, String style) {
        if(date == null){
            return null;
        }
        SimpleDateFormat format = new SimpleDateFormat(style, Locale.CHINESE);
        return format.format(date);
    }

    /**
     * Date 转 LocalDateTime
     *
     * @param date
     * @return
     */
    public static LocalDateTime getLocalDateTimeFromDate(Date date) {
        return date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime();
    }

    /**
     * Date 转 LocalDate
     *
     * @param date
     * @return
     */
    public static LocalDate getLocalDateFromDate(Date date) {
        return date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDate();
    }

    /**
     * 将String类型的日期转换为Date对象。
     *
     * @param dateString 代表日期的字符串。
     * @param style      转换格式。
     * @return 日期对象。
     */
    public static Date stringToDate(String dateString, String style) {
        try {
            SimpleDateFormat format = new SimpleDateFormat(style, Locale.CHINESE);
            return format.parse(dateString);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    public static String getShortTime(Date date) {
        String shortstring = null;

        long now = Calendar.getInstance().getTimeInMillis();
        long deltime = (now - date.getTime()) / 1000;
        if (deltime > 365 * 24 * 60 * 60) {
            shortstring = (int) (deltime / (365 * 24 * 60 * 60)) + "年";
        } else if (deltime > 24 * 60 * 60) {
            shortstring = (int) (deltime / (24 * 60 * 60)) + "天";
        } else if (deltime > 60 * 60) {
            shortstring = (int) (deltime / (60 * 60)) + "小时";
        } else if (deltime > 60) {
            shortstring = (int) (deltime / (60)) + "分钟";
        } else if (deltime > 1) {
            shortstring = deltime + "秒";
        } else {
            shortstring = "1秒";
        }
        return shortstring;
    }

    /**
     * 前端展示的通用时间日期
     * @param date
     * @return
     */
    public static String dateToViewString(Date date){
        return DateUtil.dateToString(date,DateUtil.YYYY_MM_DD_HH_MM_SS);
    }

    public static int getDiffMinutes(Date date1, Date date2) {
        return Math.abs((int)((date1.getTime() - date2.getTime()) / 1000 /60));
    }

    public static int getDiffDays(Date date1, Date date2) {
        return Math.abs((int)((date1.getTime() - date2.getTime()) / 1000 /60 / 60 / 24));
    }

    public static String dealTimeBegin(String timeStr){
        if(timeStr!=null&&timeStr.trim().length()>=10){
            return timeStr.substring(0,10) + "  00:00:00";
        }
        return timeStr;
    }
    public static String dealTimeEnd(String timeStr){
        if(timeStr != null && timeStr.trim().length()>=10){
            return timeStr.substring(0,10) + " 23:59:59";
        }
        return timeStr;
    }

}
